<?php

namespace App\Library;

use Illuminate\Database\Eloquent\Model;
use Yansongda\Pay\Pay;

class YsdLib
{
    /**
     * configByModel
     * @param Model $model
     * @return array
     */
    public static function configByModel(Model $model): array
    {
        return array_merge(match ($model->payment_method_id) {
            1 => self::alipay($model->config),
            2 => self::wechat($model->config),
            3 => self::douyin($model->config),
            default => [],
        }, self::base());
    }

    /**
     * config
     * @param string $method
     * @return array
     */
    public static function config(string $method = 'wechat'): array
    {
        return array_merge(self::$method(config('app.' . $method)), self::base());
    }

    /**
     * alipay
     * @param array $config
     * @return array
     */
    private static function alipay(array $config): array
    {
        $appId = $config['appId'];
        $dir = config('app.payDir') . 'cert/alipay/cert/' . $appId . '/';
        return [
            'alipay' => [
                'default' => [
                    // 必填-支付宝分配的 app_id
                    'app_id' => $appId,
                    // 必填-应用私钥 字符串或路径
                    // 在 https://open.alipay.com/develop/manage 《应用详情->开发设置->接口加签方式》中设置
                    'app_secret_cert' => file_get_contents($dir . 'app_secret_cert.txt'),
                    // 必填-应用公钥证书 路径
                    // 设置应用私钥后，即可下载得到以下3个证书
                    'app_public_cert_path' => $dir . 'appCertPublicKey.crt',
                    // 必填-支付宝公钥证书 路径
                    'alipay_public_cert_path' => $dir . 'alipayCertPublicKey_RSA2.crt',
                    // 必填-支付宝根证书 路径
                    'alipay_root_cert_path' => $dir . 'alipayRootCert.crt',
                    'notify_url' => config('app.url') . 'alipay/notify',
                    'return_url' => config('app.url') . 'alipay/notify',
                    // 选填-第三方应用授权token
                    'app_auth_token' => '',
                    // 选填-服务商模式下的服务商 id，当 mode 为 Pay::MODE_SERVICE 时使用该参数
                    'service_provider_id' => '',
                    // 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
                    'mode' => Pay::MODE_NORMAL,
                ],
            ],
        ];
    }

    /**
     * wechat
     * @param array $config
     * @return array
     */
    private static function wechat(array $config): array
    {
        $mchId = $config['mchId'];
        $secret = $config['secret'];
        $serialNo = $config['serialNo'];
        $dir = config('app.payDir') . 'cert/wechat/cert/' . $mchId . '/';
        return [
            'notify_refund_url' => config('app.url') . 'wechat/notifyRefund',
            'wechat' => [
                'default' => [
                    // 必填-商户号，服务商模式下为服务商商户号
                    // 可在 https://pay.weixin.qq.com/ 账户中心->商户信息 查看
                    'mch_id' => $mchId,
                    // 选填-v2商户私钥
                    'mch_secret_key_v2' => '',
                    // 必填-v3 商户秘钥
                    // 即 API v3 密钥(32字节，形如md5值)，可在 账户中心->API安全 中设置
                    'mch_secret_key' => $secret,
                    // 必填-商户私钥 字符串或路径
                    // 即 API证书 PRIVATE KEY，可在 账户中心->API安全->申请API证书 里获得
                    // 文件名形如：apiclient_key.pem
                    'mch_secret_cert' => $dir . 'apiclient_key.pem',
                    // 必填-商户公钥证书路径
                    // 即 API证书 CERTIFICATE，可在 账户中心->API安全->申请API证书 里获得
                    // 文件名形如：apiclient_cert.pem
                    'mch_public_cert_path' => $dir . 'apiclient_cert.pem',
                    // 必填-微信回调url
                    // 不能有参数，如?号，空格等，否则会无法正确回调
                    'notify_url' => config('app.url') . 'wechat/notify',
                    // 选填-公众号 的 app_id
                    // 可在 mp.weixin.qq.com 设置与开发->基本配置->开发者ID(AppID) 查看
                    //'mp_app_id' => 'wx762e7f3b4c38adf5',
                    'mp_app_id' => config('app.wechat.mp_app_id'),
                    // 选填-小程序 的 app_id
                    //'mini_app_id' => 'wx5d3c2d8a522e156f',
                    'mini_app_id' => config('app.wechat.mini_app_id'),
                    //小程序密钥
                    'mini_app_secret' => config('app.wechat.mini_app_secret'),
                    // 选填-app 的 app_id
                    'app_id' => '',
                    // 选填-服务商模式下，子公众号 的 app_id
                    'sub_mp_app_id' => '',
                    // 选填-服务商模式下，子 app 的 app_id
                    'sub_app_id' => '',
                    // 选填-服务商模式下，子小程序 的 app_id
                    'sub_mini_app_id' => '',
                    // 选填-服务商模式下，子商户id
                    'sub_mch_id' => '',
                    // 选填-微信平台公钥证书路径, optional，强烈建议 php-fpm 模式下配置此参数
                    'wechat_public_cert_path' => [
                        $serialNo => $dir . 'wechatPublicKey.pem',
                    ],
                    // 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SERVICE
                    'mode' => Pay::MODE_NORMAL,
                ]
            ],
        ];
    }

    /**
     * douyin
     * @param array $config
     * @return array
     */
    private static function douyin(array $config): array
    {
        return [
            'douyin' => [
                'default' => [
                    // 选填-商户号
                    // 抖音开放平台 --> 应用详情 --> 支付信息 --> 产品管理 --> 商户号
                    'mch_id' => $config['mchId'],
                    // 必填-支付 Token，用于支付回调签名
                    // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> Token(令牌)
                    'mch_secret_token' => $config['token'],
                    // 必填-支付 SALT，用于支付签名
                    // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> SALT
                    'mch_secret_salt' => $config['salt'],
                    // 必填-小程序 app_id
                    // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> 小程序appid
                    'mini_app_id' => $config['appId'],
                    // 选填-抖音开放平台服务商id
                    'thirdparty_id' => '',
                    // 选填-抖音支付回调地址
                    'notify_url' => env('APP_URL') . 'douyin/notify',
                ],
            ],
        ];
    }

    private static function base(): array
    {
        return [
            'logger' => [
                'enable' => true,
                'file' => storage_path('logs/pay/pay.log'),
                'identify' => 'yansongda.artful',
                'level' => 'debug',
                'type' => 'daily',
                'max_file' => 3650,
                'permission' => 0777,
            ],
            'http' => [
                'timeout' => 5.0,
                'connect_timeout' => 3.0,
                'headers' => [
                    'User-Agent' => 'yansongda/artful-v1',
                ],
            ],
        ];
    }
}
